package com.di.base.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.di.base.common.dto.OrderRequestDTO;
import com.di.base.entity.OrderTbl;
import com.di.base.dao.OrderTblDao;
import com.di.base.service.OrderTblService;
import io.seata.core.context.RootContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.Map;
import java.util.UUID;

/**
 * (OrderTbl)表服务实现类
 * 实现 Saga 模式所需的方法
 *
 * @author makejava
 * @since 2025-07-08 22:45:48
 */
@Slf4j
@Service("orderTblService") // Bean 名称必须与 JSON 中的 ServiceName 一致
public class OrderTblServiceImpl extends ServiceImpl<OrderTblDao, OrderTbl> implements OrderTblService {

    /**
     * Saga 模式创建订单方法 (被状态机调用)
     * @param orderRequestDTO
     */
    @Override
    @Transactional // Saga 模式下，每个服务方法也需要本地事务
    public void createOrder(OrderRequestDTO orderRequestDTO) {
        log.info("Saga模式 - 开始创建订单, XID: {}", RootContext.getXID());
        String userId = orderRequestDTO.getUserId();
        String productId = orderRequestDTO.getProductId();
        Integer count = orderRequestDTO.getCount();
        Double amount = orderRequestDTO.getAmount();
        OrderTbl order = new OrderTbl();
        order.setUserId(userId);
        order.setProductId(productId);
        order.setCount(count);
        order.setAmount(amount);
        order.setStatus(0); // 0: 创建中
        order.setCreateTime(new Date());
        // 添加业务键，用于标识这次 Saga 执行，有助于补偿
        this.save(order);
        log.info("Saga模式 - 订单创建成功, 订单ID: {}", order.getId());
        // 注意：Saga 模式下，方法通常返回 void 或者通过抛出异常来控制流程
        // 如果需要返回值给状态机判断，可以返回特定对象或字符串
    }

    /**
     * Saga 模式取消订单方法 (补偿操作)
     * @param orderRequestDTO
     */
    @Override
    @Transactional
    public void cancelOrder(OrderRequestDTO orderRequestDTO) {
        String userId = orderRequestDTO.getUserId();
        String productId = orderRequestDTO.getProductId();
        Integer count = orderRequestDTO.getCount();
        Double amount = orderRequestDTO.getAmount();
        log.info("Saga模式 - 开始补偿订单, XID: {}", RootContext.getXID());
        // 补偿逻辑：将最近创建的、未完成的、匹配的订单标记为已取消
        // 实际应用中，可能需要更精确的标识符（如订单ID）来定位订单
        OrderTbl orderToUpdate = this.lambdaQuery()
                .eq(OrderTbl::getUserId, userId)
                .eq(OrderTbl::getProductId, productId)
                .eq(OrderTbl::getCount, count)
                .eq(OrderTbl::getAmount, amount)
                .eq(OrderTbl::getStatus, 0) // 状态为创建中
                .orderByDesc(OrderTbl::getCreateTime) // 获取最新的
                .last("LIMIT 1") // 限制一条
                .one();

        if (orderToUpdate != null) {
            orderToUpdate.setStatus(2); // 2: 已取消
            this.updateById(orderToUpdate);
            log.info("Saga模式 - 订单已取消, 订单ID: {}", orderToUpdate.getId());
        } else {
            log.warn("Saga模式 - 未找到需要取消的订单, userId: {}, productId: {}", userId, productId);
            // 根据业务需求，可以选择抛出异常或记录日志
        }
    }
}